package com.ep.instruktor.kartypracy;

import java.util.Date;

import com.ep.general.ActionSupportCustom;
import com.ep.general.instruktor.Instruktor;
import com.ep.general.instruktor.InstruktorMdt;
import com.ep.general.instruktor.kartypracy.KartaPracyMdt;
import com.ep.general.instruktor.kartypracy.StatusKartyPracy;
import com.ep.general.instruktor.kartypracy.db.KartaPracy;
import com.ep.instruktor.app.login.LoginRequierd;

public class KartyAction extends ActionSupportCustom<Instruktor> implements
		LoginRequierd {

	private static final long serialVersionUID = -5149717749472596016L;
	private KartyView view;
	private KartaPracyForm form;
	private String KARTA_PRACY_KEY = "kartaPracyKey";
	private int kartaId;

	public String list() {
		setDataArray(getView().get(getLoggedUser().getId()));
		return DATA_ARRAY;
	}

	public String listMiesiac() {
		setDataArray(getView().getMonth(getLoggedUser().getId()));
		return DATA_ARRAY;
	}

	public String listTydzien() {
		setDataArray(getView().getWeek(getLoggedUser().getId()));
		return DATA_ARRAY;
	}

	private KartaPracy newItem() {
		KartaPracy item = new KartaPracy();
		item.setData(new Date());
		item.setGodzinyJazdy(0);
		item.setGodzinyWykladow(0);
		item.setGodzinyPozostale(0);
		item.setInstruktor(new InstruktorMdt().get(getLoggedUser().getId()));
		item.setStatusKarty(StatusKartyPracy.OCZEKIWANIE);
		return item;
	}

	public String add() {
		getForm().setData(newItem());

		getSession().remove(KARTA_PRACY_KEY);
		getSession().put(KARTA_PRACY_KEY, getForm());

		return EDIT;
	}

	public String edit() {
		getForm().setData(new KartaPracyMdt().get(kartaId));

		getSession().remove(KARTA_PRACY_KEY);
		getSession().put(KARTA_PRACY_KEY, getForm());

		return EDIT;
	}

	private boolean isValid(KartaPracy item, boolean isEdit) {
		if (!isEdit) {
			if (item.getData() == null) {
				setText("Proszę wybrać datę");
				return false;
			}
		}

		if (!new KartaPracyMdt().isDataUnique(item.getData())) {
			setText("Karta na wybrany dzień już istnieje");
			return false;
		}

		if (item.getGodzinyJazdy() > 24 || item.getGodzinyJazdy() < 0) {
			setText("Nieprawidłowo wprowadzone godziny jazdy !");
			return false;
		}

		if (item.getGodzinyWykladow() > 24 || item.getGodzinyWykladow() < 0) {
			setText("Nieprawidłowo wprowadzone godziny jazdy !");
			return false;
		}

		if (item.getGodzinyPozostale() > 24 || item.getGodzinyPozostale() < 0) {
			setText("Nieprawidłowo wprowadzone godziny jazdy !");
			return false;
		}
		return true;
	}

	public String saveNew() {
		if (getForm().getData() == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}

		if (!isValid(getForm().getData(), false)) {
			return TEXT_RESULT;
		}

		getForm().getData().setInstruktor(
				new InstruktorMdt().get(getLoggedUser().getId()));
		getForm().getData().setStatusKarty(StatusKartyPracy.OCZEKIWANIE);
		new KartaPracyMdt().makePersistent(getForm().getData());

		getSession().remove(KARTA_PRACY_KEY);
		setText("Karta pracy została poprawnie zapisana");

		return TEXT_RESULT;
	}

	public String save() {
		KartaPracy kartaEdytowana = ((KartaPracyForm) getSession().get(
				KARTA_PRACY_KEY)).getData();
		KartaPracy kartaNowa = getForm().getData();

		if (kartaEdytowana == null) {
			setText("Brak karty pracy !");
			return TEXT_RESULT;
		}

		if (kartaEdytowana.getStatusKarty() != StatusKartyPracy.OCZEKIWANIE) {
			setText("Status karty pracy nie pozwala na wprowadzanie zmian !");
			return TEXT_RESULT;
		}

		if (!isValid(kartaNowa, true)) {
			return TEXT_RESULT;
		}

		kartaNowa.setInstruktor(new InstruktorMdt()
				.get(getLoggedUser().getId()));
		kartaNowa.setStatusKarty(StatusKartyPracy.OCZEKIWANIE);

		if (!kartaEdytowana.compareAndCopy(kartaNowa)) {
			setText("Brak zmian po edycji !");
			return TEXT_RESULT;
		}

		new KartaPracyMdt().makePersistent(kartaEdytowana);

		getSession().remove(KARTA_PRACY_KEY);
		setText("Karta pracy została poprawnie zmieniona");

		return TEXT_RESULT;
	}

	private KartyView getView() {
		if (view == null)
			view = new KartyView();
		return view;
	}

	public KartaPracyForm getForm() {
		if (form == null)
			form = new KartaPracyForm();
		return form;
	}

	public void setForm(KartaPracyForm form) {
		this.form = form;
	}

	public int getKartaId() {
		return kartaId;
	}

	public void setKartaId(int kartaId) {
		this.kartaId = kartaId;
	}

}
